package top.shiyiri.stream2;

import org.junit.Test;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * @author Aunean
 * @date 2022/1/10
 */
/*
RandomAccessFile 的使用：
1.RandomAccessFile 直接继承与 java.lang.Object 类，实现了 DataInput 和 DataOutput 接口
2.RandomAccessFile 既可以作为一个输入流，又可以作为一个输出流
3.如果 RandomAccessFile 作为输出流时，写出到的文件如果不存在，则在执行过程中创建此文件
    如果写出到的文件存在，则会对原有文件内容进行覆盖（默认情况下，从索引0位置覆盖，一个字母占一个字节，汉字在UTF8中占三个字节）
4.可以通过相关的操作，实现 RandomAccessFile “插入” 数据的效果

 */
public class RandomAccessFileTest {

    @Test
    public void test1() {
        RandomAccessFile raf2 = null;
        try {
            RandomAccessFile raf1 = new RandomAccessFile(new File("../data/photo/u029.png"), "r");
            raf2 = new RandomAccessFile(new File("../data/photo/u029_1.png"), "rw");

            byte[] buffer = new byte[1024];
            int len;

            while ((len = raf1.read(buffer)) != -1) {
                raf2.write(buffer, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {

            try {
                assert raf2 != null;
                raf2.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                raf2.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Test
    public void test2() throws IOException{

        RandomAccessFile raf1 = new RandomAccessFile(new File("hello_1.txt"), "rw");

        raf1.seek(3);//将指针调到角标为3的位置


        StringBuilder builder = new StringBuilder((int)new File("hello_1").length());
        byte[] buffer = new byte[20];
        int len;
        while ((len = raf1.read(buffer)) != -1) {
            builder.append(new String(buffer, 0, len));
        }
        //调回指针
        raf1.seek(3);
        raf1.write("zzz".getBytes());

        //将StringBuilder中的数据写入到文件中
        raf1.write(builder.toString().getBytes());
        raf1.close();
    }
}
